package org.eclipse.jdt.internal.corext.refactoring.codingspectator;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ltk.core.refactoring.codingspectator.CodeSnippetInformation;
import org.eclipse.jdt.core.ITypeRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.NodeFinder;
import org.eclipse.jdt.internal.ui.JavaPlugin;
/**
*
* @author Mohsen Vakilian
* @author nchen
*
*/
public class TextSelectionCodeSnippetInformationExtractor extends CodeSnippetInformationExtractor {
private int selectionStart;
private int selectionLength;
public TextSelectionCodeSnippetInformationExtractor(ITypeRoot typeRoot, int selectionStart, int selectionLength) {
this.typeRoot= typeRoot;
this.selectionStart= selectionStart;
this.selectionLength= selectionLength;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.codingspectator.ICodeSnippetInformationExtractor#extractCodeSnippetInformation()
*/
public CodeSnippetInformation extractCodeSnippetInformation() {
String codeSnippet= getCodeSnippet();
String relativeOffset= getSnippetRelativeOffset(getCodeSnippetNode());
String selectedText= getSelectedText();
return new CodeSnippetInformation(codeSnippet, relativeOffset, selectedText);
}
private String getSelectedText() {
try {
return getText(selectionStart, selectionLength);
} catch (IndexOutOfBoundsException e) {
JavaPlugin.log(e);
} catch (JavaModelException e) {
JavaPlugin.log(e);
}
return DEFAULT_SELECTED_TEXT;
}
public String getSnippetRelativeOffset(ASTNode node) {
String snippetOffset= DEFAULT_NULL_RELATIVE_SELECTION;
if (node != null) {
snippetOffset= Integer.toString(selectionStart - node.getStartPosition()) + " " + selectionLength; //$NON-NLS-1$
}
return snippetOffset;
}
protected ASTNode findTargetNode() throws CoreException {
ASTNode localNode= getCompilationUnitASTFromTypeRoot();
// see (org.eclipse.jdt.internal.corext.refactoring.code.ExtractMethodRefactoring.checkInitialConditions(IProgressMonitor))
return NodeFinder.perform(localNode, selectionStart, selectionLength);
}
}